﻿#define ChatGroup

using MyBot.Api;
using MyBot.Datas;
using MyBot.Expansions.Bot;
using MyBot.Models.MessageModels;
using Newtonsoft.Json.Linq;
using QQRobot.AMiao.Instructions;
using QQRobot.Services;
using System.Text;

namespace QQRobot.AMiao
{
    public class AmiaoRobot
    {

        // 声明鉴权信息
        private static OpenApiAccessInfo OpenApiAccess()
        {
            OpenApiAccessInfo openApiAccessInfo = new OpenApiAccessInfo()
            {
                BotQQ = "527758393",
                BotAppId = "102453757",
                BotToken = "7rQu47QhqtI84NCRxpjbx69ehnTpR7gH",
                BotSecret = "I0iRAtcL4oYI2mWG1mXI3oaM8ugSE1ob",
            };
            return openApiAccessInfo;
        }

        /// <summary>
        /// 上线机器人
        /// </summary>
        /// <returns></returns>

        public static async Task OnLineRobot()
        {


            // 鉴权信息在实例化时传入
            var qChannelApi = new QQChannelApi(OpenApiAccess());

            // 指定Api请求使用Bot身份
            qChannelApi.UseBotIdentity();

            qChannelApi.UseSandBoxMode();

            // 指定Api通道模式为沙盒模式 (测试时使用)
            // 不指定的情况下默认是正式模式
            //qChannelApi.UseSandBoxMode();

            // 实例化一个 ChannelBot,该类是一个容易理解且简单的类
            // 帮助你快速实现一个利于理解学习与开发的机器人原型
            // 将鉴权信息 (openApiAccessInfo) 传入构造函数
            ChannelBot channelBot = new(qChannelApi);

            // 注册群聊消息事件
            channelBot.RegisterChatEvent();
            channelBot.RegisterAtMessageEvent();
            channelBot.RegisterInteractionEvent();

            // 为链接官方平台成功事件绑定一个回调函数



            channelBot.OnConnected += () =>
            {
                System.Console.WriteLine("链接成功!");
            };
            // 为鉴权成功事件绑定一个回调函数
            channelBot.AuthenticationSuccess += () =>
            {
                System.Console.WriteLine("机器人已上线");
            };
            // 为机器人出现异常事件绑定一个回调函数
            channelBot.OnError += (ex) =>
            {
                System.Console.WriteLine($"机器人出现错误 -> {ex.Message}");
            };

            channelBot.ReceivedChatGroupMessage += async (message) =>
            {
                await Command.GroupCommandImplement(message, qChannelApi);
            };


            channelBot.ReceivedChatUserMessage += async (message) =>
            {
                var msgId = message.Id; //消息ID
                var content = message.Content;//消息内容

                var openId = message.Author.UserOpenId; //群聊消息发送者的OpenId
                var msg = qChannelApi.GetChatMessageApi();

                var media = await msg.SendUserMediaAsync(
                     openId,
                     mediaType: ChatMediaType.Image,
                     "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png",
                     false
                     );

                await msg.SendUserMessageAsync(
                    openId,
                      $"收到消息啦！您发送的消息为 ->{message.Content}",
                    msgType: ChatMessageType.Media,
                    media: new ChatMessageMedia { FileInfo = media.FileInfo },
                    passiveMsgId: msgId
                    );
            };

            // 为接收到@机器人事件绑定一个回调函数
            // message 为收到的消息内容
            channelBot.ReceivedAtMessage += async (message) =>
            {
                // 使用QQChannelApi异步回复一个与用户发送一样的消息内容

                // 发送消息时，如果机器人中的一些能力未联系官方开通，会导致发送失败，或者发送成功但需要等待官方人工审核
                // 发送失败或需要等待官方审核时会抛出异常，请注意捕获
                await qChannelApi
                    .GetMessageApi()
                    .SendTextMessageAsync(message.ChannelId, $"收到消息啦！您发送的消息为 -> {message.Content}", message.Id);



            };

            channelBot.ReceivedDirectMessage += async (message) =>
            {
                await qChannelApi
                       .GetMessageApi()
                       .SendTextMessageAsync(message.ChannelId, $"收到消息啦！您发送的消息为 -> {message.Content}", message.Id);
            };





            // 完成以上配置后将机器人上线
            await channelBot.OnlineAsync();

            // 因为是异步处理，所以需要阻塞控制台 
            // 否则控制台会闪退(因为此时同步代码已经执行完毕)
            await Task.Delay(-1);

            // 因为是异步处理，所以需要阻塞控制台 
            // 否则控制台会闪退(因为此时同步代码已经执行完毕)
            // 输入q退出控制台程序
            while (Console.ReadLine().ToUpper() != "Q")
            {

            }

            System.Console.WriteLine("程序已退出..");

        }



    }
}
